linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] habanalabs: make tpc registers secured
@ 2019-05-30  8:46 Dalit Ben Zoor
  2019-05-30  8:46 ` [PATCH 2/3] habanalabs: clear sobs and monitors in context switch Dalit Ben Zoor
  2019-05-30  8:46 ` [PATCH 3/3] habanalabs: restore unsecured registers default values Dalit Ben Zoor
  0 siblings, 2 replies; 4+ messages in thread
From: Dalit Ben Zoor @ 2019-05-30  8:46 UTC (permalink / raw)
  To: oded.gabbay; +Cc: linux-kernel

Set protection bits for some tpc registers that should to be
secured.

Signed-off-by: Dalit Ben Zoor <dbenzoor@habana.ai>
---
 drivers/misc/habanalabs/goya/goya_security.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/misc/habanalabs/goya/goya_security.c b/drivers/misc/habanalabs/goya/goya_security.c
index d95d1b2f860d..d6ec12b3e692 100644
--- a/drivers/misc/habanalabs/goya/goya_security.c
+++ b/drivers/misc/habanalabs/goya/goya_security.c
@@ -677,6 +677,17 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev)
 	goya_pb_set_block(hdev, mmTPC0_RD_REGULATOR_BASE);
 	goya_pb_set_block(hdev, mmTPC0_WR_REGULATOR_BASE);
 
+	pb_addr = (mmTPC0_CFG_SEMAPHORE & ~0xFFF) + PROT_BITS_OFFS;
+	word_offset = ((mmTPC0_CFG_SEMAPHORE & PROT_BITS_OFFS) >> 7) << 2;
+
+	mask = 1 << ((mmTPC0_CFG_SEMAPHORE & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_VFLAGS & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_SFLAGS & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_LFSR_POLYNOM & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_STATUS & 0x7F) >> 2);
+
+	WREG32(pb_addr + word_offset, ~mask);
+
 	pb_addr = (mmTPC0_CFG_CFG_BASE_ADDRESS_HIGH & ~0xFFF) + PROT_BITS_OFFS;
 	word_offset = ((mmTPC0_CFG_CFG_BASE_ADDRESS_HIGH &
 			PROT_BITS_OFFS) >> 7) << 2;
@@ -684,6 +695,11 @@ static void goya_init_tpc_protection_bits(struct hl_device *hdev)
 	mask |= 1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2);
 	mask |= 1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_LOW & 0x7F) >> 2);
 	mask |= 1 << ((mmTPC0_CFG_SM_BASE_ADDRESS_HIGH & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_CFG_SUBTRACT_VALUE & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_TPC_STALL & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_MSS_CONFIG & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_TPC_INTR_CAUSE & 0x7F) >> 2);
+	mask |= 1 << ((mmTPC0_CFG_TPC_INTR_MASK & 0x7F) >> 2);
 
 	WREG32(pb_addr + word_offset, ~mask);
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] habanalabs: clear sobs and monitors in context switch
  2019-05-30  8:46 [PATCH 1/3] habanalabs: make tpc registers secured Dalit Ben Zoor
@ 2019-05-30  8:46 ` Dalit Ben Zoor
  2019-05-30  8:46 ` [PATCH 3/3] habanalabs: restore unsecured registers default values Dalit Ben Zoor
  1 sibling, 0 replies; 4+ messages in thread
From: Dalit Ben Zoor @ 2019-05-30  8:46 UTC (permalink / raw)
  To: oded.gabbay; +Cc: linux-kernel

On context switch we need to ensure that each user is not be affected by
other user, so we need to clear sync objects and monitors in context
switch instead of in restore_phase_topology function.

Signed-off-by: Dalit Ben Zoor <dbenzoor@habana.ai>
---
 drivers/misc/habanalabs/goya/goya.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
index e0fc511acaec..87859c55b4b8 100644
--- a/drivers/misc/habanalabs/goya/goya.c
+++ b/drivers/misc/habanalabs/goya/goya.c
@@ -3919,6 +3919,11 @@ void goya_update_eq_ci(struct hl_device *hdev, u32 val)
 }
 
 void goya_restore_phase_topology(struct hl_device *hdev)
+{
+
+}
+
+static void goya_clear_sm_regs(struct hl_device *hdev)
 {
 	int i, num_of_sob_in_longs, num_of_mon_in_longs;
 
@@ -4569,6 +4574,8 @@ int goya_context_switch(struct hl_device *hdev, u32 asid)
 	WREG32(mmTPC_PLL_CLK_RLX_0, 0x200020);
 	goya_mmu_prepare(hdev, asid);
 
+	goya_clear_sm_regs(hdev);
+
 	return 0;
 }
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] habanalabs: restore unsecured registers default values
  2019-05-30  8:46 [PATCH 1/3] habanalabs: make tpc registers secured Dalit Ben Zoor
  2019-05-30  8:46 ` [PATCH 2/3] habanalabs: clear sobs and monitors in context switch Dalit Ben Zoor
@ 2019-05-30  8:46 ` Dalit Ben Zoor
  2019-06-01  5:01   ` Oded Gabbay
  1 sibling, 1 reply; 4+ messages in thread
From: Dalit Ben Zoor @ 2019-05-30  8:46 UTC (permalink / raw)
  To: oded.gabbay; +Cc: linux-kernel

unsecured registers can be changed by the user, and hence should be
restored to their default values in context switch

Signed-off-by: Dalit Ben Zoor <dbenzoor@habana.ai>
---
 drivers/misc/habanalabs/goya/goya.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
index 87859c55b4b8..81c1d576783f 100644
--- a/drivers/misc/habanalabs/goya/goya.c
+++ b/drivers/misc/habanalabs/goya/goya.c
@@ -786,7 +786,6 @@ static void goya_init_dma_ch(struct hl_device *hdev, int dma_id)
 	else
 		sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
 
-	WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO + reg_off, lower_32_bits(sob_addr));
 	WREG32(mmDMA_CH_0_WR_COMP_ADDR_HI + reg_off, upper_32_bits(sob_addr));
 	WREG32(mmDMA_CH_0_WR_COMP_WDATA + reg_off, 0x80000001);
 }
@@ -4560,10 +4559,12 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
 int goya_context_switch(struct hl_device *hdev, u32 asid)
 {
 	struct asic_fixed_properties *prop = &hdev->asic_prop;
-	u64 addr = prop->sram_base_address;
+	u64 addr = prop->sram_base_address, sob_addr;
 	u32 size = hdev->pldm ? 0x10000 : prop->sram_size;
 	u64 val = 0x7777777777777777ull;
-	int rc;
+	int rc, dma_id;
+	u32 channel_off = mmDMA_CH_1_WR_COMP_ADDR_LO -
+					mmDMA_CH_0_WR_COMP_ADDR_LO;
 
 	rc = goya_memset_device_memory(hdev, addr, size, val, false);
 	if (rc) {
@@ -4571,7 +4572,19 @@ int goya_context_switch(struct hl_device *hdev, u32 asid)
 		return rc;
 	}
 
+	/* we need to reset registers that the user is allowed to change */
+	sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
+	WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO, lower_32_bits(sob_addr));
+
+	for (dma_id = 1 ; dma_id < NUMBER_OF_EXT_HW_QUEUES ; dma_id++) {
+		sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1000 +
+							(dma_id - 1) * 4;
+		WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO + channel_off * dma_id,
+						lower_32_bits(sob_addr));
+	}
+
 	WREG32(mmTPC_PLL_CLK_RLX_0, 0x200020);
+
 	goya_mmu_prepare(hdev, asid);
 
 	goya_clear_sm_regs(hdev);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3] habanalabs: restore unsecured registers default values
  2019-05-30  8:46 ` [PATCH 3/3] habanalabs: restore unsecured registers default values Dalit Ben Zoor
@ 2019-06-01  5:01   ` Oded Gabbay
  0 siblings, 0 replies; 4+ messages in thread
From: Oded Gabbay @ 2019-06-01  5:01 UTC (permalink / raw)
  To: Dalit Ben Zoor; +Cc: linux-kernel

On Thu, May 30, 2019 at 11:46 AM Dalit Ben Zoor <dbenzoor@habana.ai> wrote:
>
> unsecured registers can be changed by the user, and hence should be
> restored to their default values in context switch
>
> Signed-off-by: Dalit Ben Zoor <dbenzoor@habana.ai>
> ---
>  drivers/misc/habanalabs/goya/goya.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
> index 87859c55b4b8..81c1d576783f 100644
> --- a/drivers/misc/habanalabs/goya/goya.c
> +++ b/drivers/misc/habanalabs/goya/goya.c
> @@ -786,7 +786,6 @@ static void goya_init_dma_ch(struct hl_device *hdev, int dma_id)
>         else
>                 sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
>
> -       WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO + reg_off, lower_32_bits(sob_addr));
>         WREG32(mmDMA_CH_0_WR_COMP_ADDR_HI + reg_off, upper_32_bits(sob_addr));
>         WREG32(mmDMA_CH_0_WR_COMP_WDATA + reg_off, 0x80000001);
>  }
> @@ -4560,10 +4559,12 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
>  int goya_context_switch(struct hl_device *hdev, u32 asid)
>  {
>         struct asic_fixed_properties *prop = &hdev->asic_prop;
> -       u64 addr = prop->sram_base_address;
> +       u64 addr = prop->sram_base_address, sob_addr;
>         u32 size = hdev->pldm ? 0x10000 : prop->sram_size;
>         u64 val = 0x7777777777777777ull;
> -       int rc;
> +       int rc, dma_id;
> +       u32 channel_off = mmDMA_CH_1_WR_COMP_ADDR_LO -
> +                                       mmDMA_CH_0_WR_COMP_ADDR_LO;
>
>         rc = goya_memset_device_memory(hdev, addr, size, val, false);
>         if (rc) {
> @@ -4571,7 +4572,19 @@ int goya_context_switch(struct hl_device *hdev, u32 asid)
>                 return rc;
>         }
>
> +       /* we need to reset registers that the user is allowed to change */
> +       sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1007;
> +       WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO, lower_32_bits(sob_addr));
> +
> +       for (dma_id = 1 ; dma_id < NUMBER_OF_EXT_HW_QUEUES ; dma_id++) {
> +               sob_addr = CFG_BASE + mmSYNC_MNGR_SOB_OBJ_1000 +
> +                                                       (dma_id - 1) * 4;
> +               WREG32(mmDMA_CH_0_WR_COMP_ADDR_LO + channel_off * dma_id,
> +                                               lower_32_bits(sob_addr));
> +       }
> +
>         WREG32(mmTPC_PLL_CLK_RLX_0, 0x200020);
> +
>         goya_mmu_prepare(hdev, asid);
>
>         goya_clear_sm_regs(hdev);
> --
> 2.17.1
>
The patch-set is:
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-06-01  5:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-30  8:46 [PATCH 1/3] habanalabs: make tpc registers secured Dalit Ben Zoor
2019-05-30  8:46 ` [PATCH 2/3] habanalabs: clear sobs and monitors in context switch Dalit Ben Zoor
2019-05-30  8:46 ` [PATCH 3/3] habanalabs: restore unsecured registers default values Dalit Ben Zoor
2019-06-01  5:01   ` Oded Gabbay

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).