From 9a401f8077e3b70275a29885aed64bd9f38b63e6 Mon Sep 17 00:00:00 2001 From: Mahesh Kumar Date: Fri, 4 Oct 2024 10:57:07 +0000 Subject: [PATCH] platform: dce: Halify HSP functions This patch Halify HSP access functions. SOC-specific HSP functions are assigned during driver prob based on of_device_is_compatible check. Jira TDS-15438 Change-Id: Ia8d68cd658eaa06dd5d06e8ba92f32907a31fd4f Signed-off-by: Mahesh Kumar Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3225858 Tested-by: mobile promotions Reviewed-by: mobile promotions --- drivers/platform/tegra/dce/dce-bootstrap.c | 4 +- drivers/platform/tegra/dce/dce-debug.c | 24 +++---- drivers/platform/tegra/dce/dce-hsp-smb.c | 62 +++++++++---------- drivers/platform/tegra/dce/dce-hsp-ss.c | 31 +++++----- drivers/platform/tegra/dce/dce-ipc-signal.c | 6 +- drivers/platform/tegra/dce/dce-mailbox.c | 18 +++--- drivers/platform/tegra/dce/dce-module.c | 52 ++++++++++++++-- drivers/platform/tegra/dce/dce-pm.c | 4 +- .../platform/tegra/dce/include/dce-hsp-t234.h | 54 ++++++++++++++++ drivers/platform/tegra/dce/include/dce-hsp.h | 35 +++++------ drivers/platform/tegra/dce/include/dce.h | 6 +- 11 files changed, 193 insertions(+), 103 deletions(-) create mode 100644 drivers/platform/tegra/dce/include/dce-hsp-t234.h diff --git a/drivers/platform/tegra/dce/dce-bootstrap.c b/drivers/platform/tegra/dce/dce-bootstrap.c index d81ad5d2..f17b0039 100644 --- a/drivers/platform/tegra/dce/dce-bootstrap.c +++ b/drivers/platform/tegra/dce/dce-bootstrap.c @@ -16,7 +16,7 @@ */ inline bool dce_fw_boot_complete(struct tegra_dce *d) { - return !!(dce_ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA) + return !!(d->hsp.ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA) & DCE_BOOT_COMPLETE); } @@ -31,7 +31,7 @@ inline bool dce_fw_boot_complete(struct tegra_dce *d) inline void dce_request_fw_boot_complete(struct tegra_dce *d) { #define DCE_BOOT_INIT_BPOS 31U - dce_ss_set(d, DCE_BOOT_INIT_BPOS, d->hsp_id, DCE_BOOT_SEMA); + d->hsp.ss_set(d, DCE_BOOT_INIT_BPOS, d->hsp_id, DCE_BOOT_SEMA); #undef DCE_BOOT_INIT_BPOS } diff --git a/drivers/platform/tegra/dce/dce-debug.c b/drivers/platform/tegra/dce/dce-debug.c index 544f83f7..e07f06ba 100644 --- a/drivers/platform/tegra/dce/dce-debug.c +++ b/drivers/platform/tegra/dce/dce-debug.c @@ -504,7 +504,7 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file, unsigned long bitmap; struct tegra_dce *d = file->private_data; u32 boot_status = d->boot_status; - hsp_sema_t ss = dce_ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA); + hsp_sema_t ss = d->hsp.ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA); if (ss & DCE_BOOT_COMPLETE) goto core_boot_done; @@ -682,25 +682,25 @@ static int dump_hsp_regs_show(struct seq_file *s, void *unused) * Dump Boot Semaphore Value */ dce_info(d, "DCE_BOOT_SEMA : 0x%x", - dce_ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA)); + d->hsp.ss_get_state(d, d->hsp_id, DCE_BOOT_SEMA)); /** * Dump Shared Mailboxes Values */ dce_info(d, "DCE_MBOX_FROM_DCE_RM : 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_RM)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_RM)); dce_info(d, "DCE_MBOX_TO_DCE_RM: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_TO_DCE_RM)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_TO_DCE_RM)); dce_info(d, "DCE_MBOX_FROM_DCE_RM_EVENT_NOTIFY: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_RM_EVENT_NOTIFY)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_RM_EVENT_NOTIFY)); dce_info(d, "DCE_MBOX_TO_DCE_RM_EVENT_NOTIFY: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_TO_DCE_RM_EVENT_NOTIFY)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_TO_DCE_RM_EVENT_NOTIFY)); dce_info(d, "DCE_MBOX_FROM_DCE_ADMIN: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_ADMIN)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_FROM_DCE_ADMIN)); dce_info(d, "DCE_MBOX_BOOT_CMD: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_BOOT_CMD)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_BOOT_CMD)); dce_info(d, "DCE_MBOX_IRQ: 0x%x", - dce_smb_read(d, d->hsp_id, DCE_MBOX_IRQ)); + d->hsp.smb_read(d, d->hsp_id, DCE_MBOX_IRQ)); /** * Dump HSP IE registers Values @@ -708,7 +708,7 @@ static int dump_hsp_regs_show(struct seq_file *s, void *unused) #define DCE_MAX_IE_REGS 5U for (i = 0; i < DCE_MAX_IE_REGS; i++) - dce_info(d, "DCE_HSP_IE_%d : 0x%x", i, dce_hsp_ie_read(d, d->hsp_id, i)); + dce_info(d, "DCE_HSP_IE_%d : 0x%x", i, d->hsp.hsp_ie_read(d, d->hsp_id, i)); #undef DCE_MAX_IE_REGS /** @@ -717,12 +717,12 @@ static int dump_hsp_regs_show(struct seq_file *s, void *unused) #define DCE_MAX_SM_FULL_REGS 8U for (i = 0; i < DCE_MAX_SM_FULL_REGS; i++) { dce_info(d, "DCE_HSP_SM_FULL_%d : 0x%x", i, - dce_smb_read_full_ie(d, d->hsp_id, i)); + d->hsp.smb_read_full_ie(d, d->hsp_id, i)); } #undef DCE_MAX_SM_FULL_REGS dce_info(d, "DCE_HSP_IR : 0x%x", - dce_hsp_ir_read(d, d->hsp_id)); + d->hsp.hsp_ir_read(d, d->hsp_id)); return 0; } diff --git a/drivers/platform/tegra/dce/dce-hsp-smb.c b/drivers/platform/tegra/dce/dce-hsp-smb.c index 37e786ca..b90f62df 100644 --- a/drivers/platform/tegra/dce/dce-hsp-smb.c +++ b/drivers/platform/tegra/dce/dce-hsp-smb.c @@ -6,9 +6,7 @@ #include #include #include - -#define DCE_MAX_NO_SMB 8 -#define DCE_MAX_HSP_IE 8 +#include /** * smb_regs is a 2D array of read-only pointers to a function returning u32. @@ -16,7 +14,7 @@ * Array of functions that retrun base addresses of shared maiboxes registers * in DCE cluster based on the mailbox id and HSP id. */ -__weak u32 (*const smb_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { +static u32 (*const smb_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SMB_T234])(void) = { { hsp_sm0_r, hsp_sm1_r, @@ -36,7 +34,7 @@ __weak u32 (*const smb_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { * Array of functions that retrun base addresses of full IE for shared * maiboxes registers in DCE cluster based on the mailbox id and HSP id. */ -__weak u32 (*const smb_full_ie_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { +static u32 (*const smb_full_ie_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SMB_T234])(void) = { { hsp_sm0_full_int_ie_r, hsp_sm1_full_int_ie_r, @@ -56,7 +54,7 @@ __weak u32 (*const smb_full_ie_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { * Array of functions that retrun base addresses of empty IE for shared * maiboxes registers in DCE cluster based on the mailbox id and HSP id. */ -__weak u32 (*const smb_empty_ie_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { +static u32 (*const smb_empty_ie_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SMB_T234])(void) = { { hsp_sm0_empty_int_ie_r, hsp_sm1_empty_int_ie_r, @@ -70,7 +68,7 @@ __weak u32 (*const smb_empty_ie_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { }; /** - * dce_smb_set - Set an u32 value to smb_#n in the DCE Cluster + * dce_smb_set_t234 - Set an u32 value to smb_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @val : val to set. @@ -79,9 +77,9 @@ __weak u32 (*const smb_empty_ie_regs[DCE_MAX_HSP][DCE_MAX_NO_SMB])(void) = { * * Return : Void */ -void dce_smb_set(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) +void dce_smb_set_t234(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) { - if (id >= DCE_MAX_NO_SMB || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_NO_SMB_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared Mailbox ID:%u or hsp:%u", id, hsp_id); return; } @@ -90,7 +88,7 @@ void dce_smb_set(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) } /** - * dce_smb_set_full_ie - Set an u32 value to smb_#n in the DCE Cluster + * dce_smb_set_full_ie_t234 - Set an u32 value to smb_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @en : enable if true and disable if false @@ -99,11 +97,11 @@ void dce_smb_set(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) * * Return : Void */ -void dce_smb_set_full_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) +void dce_smb_set_full_ie_t234(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) { u32 val = en ? 1U : 0U; - if (id >= DCE_MAX_NO_SMB || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_NO_SMB_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared Mailbox ID:%u or hsp:%u", id, hsp_id); return; } @@ -112,7 +110,7 @@ void dce_smb_set_full_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) } /** - * dce_smb_read_full_ie - Set an u32 value to smb_#n in the DCE Cluster + * dce_smb_read_full_ie_t234 - Set an u32 value to smb_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @hsp_id : ID of hsp instance used @@ -120,9 +118,9 @@ void dce_smb_set_full_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) * * Return : u32 register value */ -u32 dce_smb_read_full_ie(struct tegra_dce *d, u8 hsp_id, u8 id) +u32 dce_smb_read_full_ie_t234(struct tegra_dce *d, u8 hsp_id, u8 id) { - if (id >= DCE_MAX_NO_SMB || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_NO_SMB_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared Mailbox ID:%u or hsp:%u", id, hsp_id); return 0xffffffff; /* TODO : Add DCE Error Numbers */ } @@ -131,7 +129,7 @@ u32 dce_smb_read_full_ie(struct tegra_dce *d, u8 hsp_id, u8 id) } /** - * dce_smb_enable_empty_ie - Set an u32 value to smb_#n in the DCE Cluster + * dce_smb_enable_empty_ie_t234 - Set an u32 value to smb_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @en : enable if true and disable if false @@ -140,11 +138,11 @@ u32 dce_smb_read_full_ie(struct tegra_dce *d, u8 hsp_id, u8 id) * * Return : Void */ -void dce_smb_set_empty_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) +void dce_smb_set_empty_ie_t234(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) { u32 val = en ? 1U : 0U; - if (id >= DCE_MAX_NO_SMB || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_NO_SMB_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared Mailbox ID:%u or hsp:%u", id, hsp_id); return; } @@ -153,7 +151,7 @@ void dce_smb_set_empty_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) } /** - * dce_smb_read - Read the u32 value from smb_#n in the DCE Cluster + * dce_smb_read_t234 - Read the u32 value from smb_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @hsp_id : ID of hsp instance used @@ -161,9 +159,9 @@ void dce_smb_set_empty_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id) * * Return : actual value if successful, 0xffffffff for errors scenarios */ -u32 dce_smb_read(struct tegra_dce *d, u8 hsp_id, u8 id) +u32 dce_smb_read_t234(struct tegra_dce *d, u8 hsp_id, u8 id) { - if (id >= DCE_MAX_NO_SMB || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_NO_SMB_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared Mailbox ID:%u or hsp:%u", id, hsp_id); return 0xffffffff; /* TODO : Add DCE Error Numbers */ } @@ -178,7 +176,7 @@ u32 dce_smb_read(struct tegra_dce *d, u8 hsp_id, u8 id) * Array of functions that retrun base addresses of hsp IE * regs in DCE cluster based on the id. */ -__weak u32 (*const hsp_int_ie_regs[DCE_MAX_HSP][DCE_MAX_HSP_IE])(void) = { +static u32 (*const hsp_int_ie_regs[DCE_MAX_HSP_T234][DCE_MAX_HSP_IE_T234])(void) = { { hsp_int_ie0_r, hsp_int_ie1_r, @@ -198,13 +196,13 @@ __weak u32 (*const hsp_int_ie_regs[DCE_MAX_HSP][DCE_MAX_HSP_IE])(void) = { * Array of functions that retrun addresses of hsp IR * regs in DCE cluster based on the id. */ -__weak u32 (*const hsp_int_ir_regs[DCE_MAX_HSP])(void) = { +static u32 (*const hsp_int_ir_regs[DCE_MAX_HSP_T234])(void) = { hsp_int_ir_r, }; /** - * dce_hsp_ie_read - Read the u32 value from hsp_int_ie#n + * dce_hsp_ie_read_t234 - Read the u32 value from hsp_int_ie#n * in the DCE Cluster * * @d : Pointer to tegra_dce struct. @@ -213,9 +211,9 @@ __weak u32 (*const hsp_int_ir_regs[DCE_MAX_HSP])(void) = { * * Return : actual value if successful, 0xffffffff for errors scenarios */ -u32 dce_hsp_ie_read(struct tegra_dce *d, u8 hsp_id, u8 id) +u32 dce_hsp_ie_read_t234(struct tegra_dce *d, u8 hsp_id, u8 id) { - if (id >= DCE_MAX_HSP_IE || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_HSP_IE_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared HSP IE ID:%u or hsp:%u", id, hsp_id); return 0xffffffff; /* TODO : Add DCE Error Numbers */ } @@ -224,7 +222,7 @@ u32 dce_hsp_ie_read(struct tegra_dce *d, u8 hsp_id, u8 id) } /** - * dce_hsp_ie_write - Read the u32 value from hsp_int_ie#n + * dce_hsp_ie_write_t234 - Read the u32 value from hsp_int_ie#n * in the DCE Cluster * * @d : Pointer to tegra_dce struct. @@ -234,9 +232,9 @@ u32 dce_hsp_ie_read(struct tegra_dce *d, u8 hsp_id, u8 id) * * Return : void */ -void dce_hsp_ie_write(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) +void dce_hsp_ie_write_t234(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) { - if (id >= DCE_MAX_HSP_IE || hsp_id >= DCE_MAX_HSP) { + if (id >= DCE_MAX_HSP_IE_T234 || hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid Shared HSP IE ID:%u or hsp:%u", id, hsp_id); return; } @@ -246,7 +244,7 @@ void dce_hsp_ie_write(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) } /** - * dce_hsp_ir_read - Read the u32 value from hsp_int_ir + * dce_hsp_ir_read_t234 - Read the u32 value from hsp_int_ir * in the DCE Cluster * * @d : Pointer to tegra_dce struct. @@ -254,9 +252,9 @@ void dce_hsp_ie_write(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id) * * Return : actual value if successful, 0xffffffff for errors scenarios */ -u32 dce_hsp_ir_read(struct tegra_dce *d, u8 hsp_id) +u32 dce_hsp_ir_read_t234(struct tegra_dce *d, u8 hsp_id) { - if (hsp_id >= DCE_MAX_HSP) { + if (hsp_id >= DCE_MAX_HSP_T234) { dce_err(d, "Invalid HSP ID:%u", hsp_id); return 0xffffffff; /* TODO : Add DCE Error Numbers */ } diff --git a/drivers/platform/tegra/dce/dce-hsp-ss.c b/drivers/platform/tegra/dce/dce-hsp-ss.c index 2231356f..6aa5f574 100644 --- a/drivers/platform/tegra/dce/dce-hsp-ss.c +++ b/drivers/platform/tegra/dce/dce-hsp-ss.c @@ -6,8 +6,7 @@ #include #include #include - -#define DCE_MAX_NO_SS 4 +#include /** * ss_set_regs is a 2D array of read-only pointers to a function returning u32. @@ -15,7 +14,7 @@ * Array of functions that retrun base addresses of shared semaphores set * registers in DCE cluster based on the semaphore id and HSP id. */ -__weak u32 (*const ss_set_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { +static u32 (*const ss_set_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SS_T234])(void) = { { hsp_ss0_set_r, hsp_ss1_set_r, @@ -31,7 +30,7 @@ __weak u32 (*const ss_set_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { * Array of functions that retrun base addresses of shared semaphores clear * registers in DCE cluster based on the semaphore id and HSP id. */ -__weak u32 (*const ss_clear_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { +static u32 (*const ss_clear_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SS_T234])(void) = { { hsp_ss0_clr_r, hsp_ss1_clr_r, @@ -47,7 +46,7 @@ __weak u32 (*const ss_clear_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { * Array of functions that retrun base addresses of shared semaphores state * registers in DCE cluster based on the semaphore id and HSP id. */ -__weak u32 (*const ss_state_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { +static u32 (*const ss_state_regs[DCE_MAX_HSP_T234][DCE_MAX_NO_SS_T234])(void) = { { hsp_ss0_state_r, hsp_ss1_state_r, @@ -57,7 +56,7 @@ __weak u32 (*const ss_state_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { }; /** - * dce_ss_get_state - Get the state of ss_#n in the DCE Cluster + * dce_ss_get_state_t234 - Get the state of ss_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @hsp_id : ID of hsp instance used @@ -65,13 +64,13 @@ __weak u32 (*const ss_state_regs[DCE_MAX_HSP][DCE_MAX_NO_SS])(void) = { * * Return : u32 */ -u32 dce_ss_get_state(struct tegra_dce *d, u8 hsp_id, u8 id) +u32 dce_ss_get_state_t234(struct tegra_dce *d, u8 hsp_id, u8 id) { return dce_readl(d, ss_state_regs[hsp_id][id]()); } /** - * dce_ss_set - Set an u32 value to ss_#n in the DCE Cluster + * dce_ss_set_t234 - Set an u32 value to ss_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @bpos : bit to be set. @@ -80,16 +79,16 @@ u32 dce_ss_get_state(struct tegra_dce *d, u8 hsp_id, u8 id) * * Return : Void */ -void dce_ss_set(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) +void dce_ss_set_t234(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) { unsigned long val = 0U; - if (hsp_id >= DCE_MAX_HSP || id >= DCE_MAX_NO_SS) { + if (hsp_id >= DCE_MAX_HSP_T234 || id >= DCE_MAX_NO_SS_T234) { dce_err(d, "Invalid HSP ID:%u OR SS ID:%u", hsp_id, id); return; } - val = dce_ss_get_state(d, d->hsp_id, id); + val = dce_ss_get_state_t234(d, d->hsp_id, id); /** * Debug info. please remove @@ -111,12 +110,12 @@ void dce_ss_set(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) /** * Debug info. please remove */ - val = dce_ss_get_state(d, d->hsp_id, id); + val = dce_ss_get_state_t234(d, d->hsp_id, id); dce_info(d, "Current Value in SS#%d : %lx", id, val); } /** - * dce_ss_clear - Clear a bit in ss_#n in the DCE Cluster + * dce_ss_clear_t234 - Clear a bit in ss_#n in the DCE Cluster * * @d : Pointer to tegra_dce struct. * @bpos : bit to be cleared. @@ -125,16 +124,16 @@ void dce_ss_set(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) * * Return : Void */ -void dce_ss_clear(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) +void dce_ss_clear_t234(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id) { unsigned long val; - if (hsp_id >= DCE_MAX_HSP || id >= DCE_MAX_NO_SS) { + if (hsp_id >= DCE_MAX_HSP_T234 || id >= DCE_MAX_NO_SS_T234) { dce_err(d, "Invalid HSP ID:%u OR SS ID:%u", hsp_id, id); return; } - val = dce_ss_get_state(d, d->hsp_id, id); + val = dce_ss_get_state_t234(d, d->hsp_id, id); dce_bitmap_set(&val, bpos, 1); diff --git a/drivers/platform/tegra/dce/dce-ipc-signal.c b/drivers/platform/tegra/dce/dce-ipc-signal.c index 5b1ee89b..9e612a19 100644 --- a/drivers/platform/tegra/dce/dce-ipc-signal.c +++ b/drivers/platform/tegra/dce/dce-ipc-signal.c @@ -19,7 +19,7 @@ static void dce_ipc_mbox_notify(struct tegra_dce *d, } if (s->sema_num < DCE_NUM_SEMA_REGS) - dce_ss_set(d, s->sema_bit, d->hsp_id, s->sema_num); + d->hsp.ss_set(d, s->sema_bit, d->hsp_id, s->sema_num); dce_mailbox_set_full_interrupt(d, s->form.mbox.mb_type); } @@ -41,12 +41,12 @@ static void dce_ipc_mbox_handle_signal(struct tegra_dce *d, void *data) for (cur_s = s; cur_s != NULL; cur_s = cur_s->next) { if (cur_s->sema_num < DCE_NUM_SEMA_REGS) { - sema_val = dce_ss_get_state(d, d->hsp_id, cur_s->sema_num); + sema_val = d->hsp.ss_get_state(d, d->hsp_id, cur_s->sema_num); if ((sema_val & BIT(cur_s->sema_bit)) == 0) continue; } - dce_ss_clear(d, cur_s->sema_num, d->hsp_id, BIT(cur_s->sema_bit)); + d->hsp.ss_clear(d, cur_s->sema_num, d->hsp_id, BIT(cur_s->sema_bit)); ch = cur_s->signal->ch; diff --git a/drivers/platform/tegra/dce/dce-mailbox.c b/drivers/platform/tegra/dce/dce-mailbox.c index e003b4c8..a9707551 100644 --- a/drivers/platform/tegra/dce/dce-mailbox.c +++ b/drivers/platform/tegra/dce/dce-mailbox.c @@ -23,8 +23,8 @@ */ static u32 dce_hsp_get_irq_sources(struct tegra_dce *d) { - return (dce_hsp_ie_read(d, d->hsp_id, CCPLEX_HSP_IE) & - dce_hsp_ir_read(d, d->hsp_id)); + return (d->hsp.hsp_ie_read(d, d->hsp_id, CCPLEX_HSP_IE) & + d->hsp.hsp_ir_read(d, d->hsp_id)); } /** @@ -56,8 +56,8 @@ void dce_mailbox_isr(struct tegra_dce *d) * bit before storing the result. * */ - value = dce_smb_read(d, d->hsp_id, d_mb->r_mb); - dce_smb_set(d, 0U, d->hsp_id, d_mb->r_mb); + value = d->hsp.smb_read(d, d->hsp_id, d_mb->r_mb); + d->hsp.smb_set(d, 0U, d->hsp_id, d_mb->r_mb); dce_mailbox_store_interface_status(d, value, i); d_mb->notify(d, d_mb->notify_data); } @@ -132,7 +132,7 @@ static bool dce_mailbox_write_safe(struct tegra_dce *d, u8 id) { unsigned long val; - val = dce_smb_read(d, d->hsp_id, id); + val = d->hsp.smb_read(d, d->hsp_id, id); return !(val & BIT(31)); } @@ -157,7 +157,7 @@ void dce_mailbox_set_full_interrupt(struct tegra_dce *d, u8 id) dce_info(d, "Intr bit set multiple times for MB : [0x%x]", d_mb->s_mb); - dce_smb_set(d, BIT(31), d->hsp_id, d_mb->s_mb); + d->hsp.smb_set(d, BIT(31), d->hsp_id, d_mb->s_mb); dce_mutex_unlock(&d_mb->lock); } @@ -187,7 +187,7 @@ int dce_handle_mailbox_send_cmd_sync(struct tegra_dce *d, u32 cmd, u32 interface return -1; } - dce_smb_set(d, cmd | BIT(31), d->hsp_id, d_mb->s_mb); + d->hsp.smb_set(d, cmd | BIT(31), d->hsp_id, d_mb->s_mb); d_mb->valid = false; dce_mutex_unlock(&d_mb->lock); @@ -251,10 +251,10 @@ int dce_mailbox_init_interface(struct tegra_dce *d, u8 id, u8 s_mb, d_mb->valid = false; - dce_smb_set_full_ie(d, true, d->hsp_id, r_mb); + d->hsp.smb_set_full_ie(d, true, d->hsp_id, r_mb); ie_wr_val = BIT(r_mb) << 8U; - dce_hsp_ie_write(d, ie_wr_val, d->hsp_id, CCPLEX_HSP_IE); + d->hsp.hsp_ie_write(d, ie_wr_val, d->hsp_id, CCPLEX_HSP_IE); d_mb->s_mb = s_mb; d_mb->r_mb = r_mb; diff --git a/drivers/platform/tegra/dce/dce-module.c b/drivers/platform/tegra/dce/dce-module.c index 2091b39d..fffa23aa 100644 --- a/drivers/platform/tegra/dce/dce-module.c +++ b/drivers/platform/tegra/dce/dce-module.c @@ -25,6 +25,7 @@ #include #include #include +#include /** * The following platform info is needed for backdoor @@ -197,6 +198,42 @@ static int match_display_dev(struct device *dev, const void *data) return 0; } +/** + * dce_init_hsp_hal_fn - Function to initialize DCE HSP hal functions. + * + * @pdev : Pointer to Linux's platform device used for registering DCE. + * @pdata: pointer to dce_platform data structure + * + * Primarily used during initialization sequence and is expected to be called + * from probe only. + * + * Return : 0 if success else the corresponding error value. + */ +static int dce_init_hsp_hal_fn(struct platform_device *pdev, + struct dce_platform_data *pdata) +{ + struct device *dev = &pdev->dev; + struct device_node *node = dev->of_node; + struct tegra_dce *d = NULL; + int ret = 0; + + d = dce_get_pdata_dce(pdev); + if (of_device_is_compatible(node, "nvidia,tegra234-dce")) { + dev_info(&pdev->dev, "Setting DCE HSP functions for tegra234-dce"); + DCE_HSP_INIT_T234(d->hsp); + } else { + ret = -1; + dev_err(&pdev->dev, "DCE SOC not supported"); + } + + /** + * TODO: Get HSP_ID from DT + */ + d->hsp_id = pdata->hsp_id; + + return ret; +} + static int tegra_dce_probe(struct platform_device *pdev) { int err = 0; @@ -229,6 +266,15 @@ static int tegra_dce_probe(struct platform_device *pdev) goto os_init_err; } + /* + * Initialize SOC HSP HAL Functions + */ + err = dce_init_hsp_hal_fn(pdev, pdata); + if (err) { + dev_err(dev, "failed to init HSP functions err:%d\n", err); + goto os_init_err; + } + err = dce_req_interrupts(pdev); if (err) { dev_err(dev, "failed to get interrupts with err = %d\n", @@ -238,12 +284,6 @@ static int tegra_dce_probe(struct platform_device *pdev) d = dce_get_pdata_dce(pdev); - /** - * TODO: Get HSP_ID from DT - */ - d->hsp_id = pdata->hsp_id; - - err = dce_driver_init(d); if (err) { dce_err(d, "DCE Driver Init Failed"); diff --git a/drivers/platform/tegra/dce/dce-pm.c b/drivers/platform/tegra/dce/dce-pm.c index 137ad538..48ee2c34 100644 --- a/drivers/platform/tegra/dce/dce-pm.c +++ b/drivers/platform/tegra/dce/dce-pm.c @@ -9,14 +9,14 @@ static void dce_pm_save_state(struct tegra_dce *d) { - d->sc7_state.hsp_ie = dce_hsp_ie_read(d, d->hsp_id, CCPLEX_HSP_IE); + d->sc7_state.hsp_ie = d->hsp.hsp_ie_read(d, d->hsp_id, CCPLEX_HSP_IE); } static void dce_pm_restore_state(struct tegra_dce *d) { uint32_t val = d->sc7_state.hsp_ie; - dce_hsp_ie_write(d, val, d->hsp_id, CCPLEX_HSP_IE); + d->hsp.hsp_ie_write(d, val, d->hsp_id, CCPLEX_HSP_IE); } /** diff --git a/drivers/platform/tegra/dce/include/dce-hsp-t234.h b/drivers/platform/tegra/dce/include/dce-hsp-t234.h new file mode 100644 index 00000000..20e492b5 --- /dev/null +++ b/drivers/platform/tegra/dce/include/dce-hsp-t234.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2019-2024, NVIDIA CORPORATION. All rights reserved. + */ + +#ifndef DCE_HSP_T234_H +#define DCE_HSP_T234_H + +#include // TODO: use dce-types + +struct tegra_dce; + +#define DCE_MAX_HSP_T234 1 +#define DCE_MAX_NO_SS_T234 4 +#define DCE_MAX_NO_SMB_T234 8 +#define DCE_MAX_HSP_IE_T234 8 + +/** + * DCE HSP Shared Semaphore Utility functions. Description + * can be found with function definitions. + */ +u32 dce_ss_get_state_t234(struct tegra_dce *d, u8 hsp_id, u8 id); +void dce_ss_set_t234(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); +void dce_ss_clear_t234(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); + +/** + * DCE HSP Shared Mailbox Utility functions. Description + * can be found with function definitions. + */ +void dce_smb_set_t234(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); +void dce_smb_set_full_ie_t234(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); +u32 dce_smb_read_full_ie_t234(struct tegra_dce *d, u8 hsp_id, u8 id); +void dce_smb_set_empty_ie_t234(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); +u32 dce_smb_read_t234(struct tegra_dce *d, u8 hsp_id, u8 id); +u32 dce_hsp_ie_read_t234(struct tegra_dce *d, u8 hsp_id, u8 id); +void dce_hsp_ie_write_t234(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); +u32 dce_hsp_ir_read_t234(struct tegra_dce *d, u8 hsp_id); + +#define DCE_HSP_INIT_T234(hsp) \ +({ \ + hsp.ss_get_state = dce_ss_get_state_t234; \ + hsp.ss_set = dce_ss_set_t234; \ + hsp.ss_clear = dce_ss_clear_t234; \ + hsp.smb_set = dce_smb_set_t234; \ + hsp.smb_set_full_ie = dce_smb_set_full_ie_t234; \ + hsp.smb_read_full_ie = dce_smb_read_full_ie_t234; \ + hsp.smb_set_empty_ie = dce_smb_set_empty_ie_t234; \ + hsp.smb_read = dce_smb_read_t234; \ + hsp.hsp_ie_read = dce_hsp_ie_read_t234; \ + hsp.hsp_ie_write = dce_hsp_ie_write_t234; \ + hsp.hsp_ir_read = dce_hsp_ir_read_t234; \ +}) + +#endif diff --git a/drivers/platform/tegra/dce/include/dce-hsp.h b/drivers/platform/tegra/dce/include/dce-hsp.h index aa32231a..abbbbb2f 100644 --- a/drivers/platform/tegra/dce/include/dce-hsp.h +++ b/drivers/platform/tegra/dce/include/dce-hsp.h @@ -6,29 +6,24 @@ #ifndef DCE_HSP_H #define DCE_HSP_H -#include +#include // TODO: use dce-types struct tegra_dce; -/** - * DCE HSP Shared Semaphore Utility functions. Description - * can be found with function definitions. - */ -u32 dce_ss_get_state(struct tegra_dce *d, u8 hsp_id, u8 id); -void dce_ss_set(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); -void dce_ss_clear(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); +struct dce_hsp_fn { + u32 (*ss_get_state)(struct tegra_dce *d, u8 hsp_id, u8 id); + void (*ss_set)(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); + void (*ss_clear)(struct tegra_dce *d, u8 bpos, u8 hsp_id, u8 id); -/** - * DCE HSP Shared Mailbox Utility functions. Description - * can be found with function definitions. - */ -void dce_smb_set(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); -void dce_smb_set_full_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); -u32 dce_smb_read_full_ie(struct tegra_dce *d, u8 hsp_id, u8 id); -void dce_smb_set_empty_ie(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); -u32 dce_smb_read(struct tegra_dce *d, u8 hsp_id, u8 id); -u32 dce_hsp_ie_read(struct tegra_dce *d, u8 hsp_id, u8 id); -void dce_hsp_ie_write(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); -u32 dce_hsp_ir_read(struct tegra_dce *d, u8 hsp_id); + void (*smb_set)(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); + void (*smb_set_full_ie)(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); + u32 (*smb_read_full_ie)(struct tegra_dce *d, u8 hsp_id, u8 id); + void (*smb_set_empty_ie)(struct tegra_dce *d, bool en, u8 hsp_id, u8 id); + u32 (*smb_read)(struct tegra_dce *d, u8 hsp_id, u8 id); + + u32 (*hsp_ie_read)(struct tegra_dce *d, u8 hsp_id, u8 id); + void (*hsp_ie_write)(struct tegra_dce *d, u32 val, u8 hsp_id, u8 id); + u32 (*hsp_ir_read)(struct tegra_dce *d, u8 hsp_id); +}; #endif diff --git a/drivers/platform/tegra/dce/include/dce.h b/drivers/platform/tegra/dce/include/dce.h index 973967b8..1bd637ee 100644 --- a/drivers/platform/tegra/dce/include/dce.h +++ b/drivers/platform/tegra/dce/include/dce.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2019-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #ifndef TEGRA_DCE_H @@ -179,6 +179,10 @@ struct tegra_dce { * @hsp_id - HSP instance id used for dce communication */ u32 hsp_id; + /** + * @hsp - Struct to store function pointers for HSP access. + */ + struct dce_hsp_fn hsp; /** * @boot_status - u32 variable to store dce's boot status. */