@@ -169,7 +169,7 @@ static void its_encode_cmd(struct its_cmd_block *cmd, u8 cmd_nr)
169169
170170static void its_encode_devid (struct its_cmd_block * cmd , u32 devid )
171171{
172- cmd -> raw_cmd [0 ] &= ~( 0xffffUL << 32 );
172+ cmd -> raw_cmd [0 ] &= BIT_ULL ( 32 ) - 1 ;
173173 cmd -> raw_cmd [0 ] |= ((u64 )devid ) << 32 ;
174174}
175175
@@ -802,6 +802,7 @@ static int its_alloc_tables(struct its_node *its)
802802 int i ;
803803 int psz = SZ_64K ;
804804 u64 shr = GITS_BASER_InnerShareable ;
805+ u64 cache = GITS_BASER_WaWb ;
805806
806807 for (i = 0 ; i < GITS_BASER_NR_REGS ; i ++ ) {
807808 u64 val = readq_relaxed (its -> base + GITS_BASER + i * 8 );
@@ -848,7 +849,7 @@ static int its_alloc_tables(struct its_node *its)
848849 val = (virt_to_phys (base ) |
849850 (type << GITS_BASER_TYPE_SHIFT ) |
850851 ((entry_size - 1 ) << GITS_BASER_ENTRY_SIZE_SHIFT ) |
851- GITS_BASER_WaWb |
852+ cache |
852853 shr |
853854 GITS_BASER_VALID );
854855
@@ -874,9 +875,12 @@ static int its_alloc_tables(struct its_node *its)
874875 * Shareability didn't stick. Just use
875876 * whatever the read reported, which is likely
876877 * to be the only thing this redistributor
877- * supports.
878+ * supports. If that's zero, make it
879+ * non-cacheable as well.
878880 */
879881 shr = tmp & GITS_BASER_SHAREABILITY_MASK ;
882+ if (!shr )
883+ cache = GITS_BASER_nC ;
880884 goto retry_baser ;
881885 }
882886
@@ -980,16 +984,39 @@ static void its_cpu_init_lpis(void)
980984 tmp = readq_relaxed (rbase + GICR_PROPBASER );
981985
982986 if ((tmp ^ val ) & GICR_PROPBASER_SHAREABILITY_MASK ) {
987+ if (!(tmp & GICR_PROPBASER_SHAREABILITY_MASK )) {
988+ /*
989+ * The HW reports non-shareable, we must
990+ * remove the cacheability attributes as
991+ * well.
992+ */
993+ val &= ~(GICR_PROPBASER_SHAREABILITY_MASK |
994+ GICR_PROPBASER_CACHEABILITY_MASK );
995+ val |= GICR_PROPBASER_nC ;
996+ writeq_relaxed (val , rbase + GICR_PROPBASER );
997+ }
983998 pr_info_once ("GIC: using cache flushing for LPI property table\n" );
984999 gic_rdists -> flags |= RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING ;
9851000 }
9861001
9871002 /* set PENDBASE */
9881003 val = (page_to_phys (pend_page ) |
989- GICR_PROPBASER_InnerShareable |
990- GICR_PROPBASER_WaWb );
1004+ GICR_PENDBASER_InnerShareable |
1005+ GICR_PENDBASER_WaWb );
9911006
9921007 writeq_relaxed (val , rbase + GICR_PENDBASER );
1008+ tmp = readq_relaxed (rbase + GICR_PENDBASER );
1009+
1010+ if (!(tmp & GICR_PENDBASER_SHAREABILITY_MASK )) {
1011+ /*
1012+ * The HW reports non-shareable, we must remove the
1013+ * cacheability attributes as well.
1014+ */
1015+ val &= ~(GICR_PENDBASER_SHAREABILITY_MASK |
1016+ GICR_PENDBASER_CACHEABILITY_MASK );
1017+ val |= GICR_PENDBASER_nC ;
1018+ writeq_relaxed (val , rbase + GICR_PENDBASER );
1019+ }
9931020
9941021 /* Enable LPIs */
9951022 val = readl_relaxed (rbase + GICR_CTLR );
@@ -1026,7 +1053,7 @@ static void its_cpu_init_collection(void)
10261053 * This ITS wants a linear CPU number.
10271054 */
10281055 target = readq_relaxed (gic_data_rdist_rd_base () + GICR_TYPER );
1029- target = GICR_TYPER_CPU_NUMBER (target );
1056+ target = GICR_TYPER_CPU_NUMBER (target ) << 16 ;
10301057 }
10311058
10321059 /* Perform collection mapping */
@@ -1422,14 +1449,26 @@ static int its_probe(struct device_node *node, struct irq_domain *parent)
14221449
14231450 writeq_relaxed (baser , its -> base + GITS_CBASER );
14241451 tmp = readq_relaxed (its -> base + GITS_CBASER );
1425- writeq_relaxed (0 , its -> base + GITS_CWRITER );
1426- writel_relaxed (GITS_CTLR_ENABLE , its -> base + GITS_CTLR );
14271452
1428- if ((tmp ^ baser ) & GITS_BASER_SHAREABILITY_MASK ) {
1453+ if ((tmp ^ baser ) & GITS_CBASER_SHAREABILITY_MASK ) {
1454+ if (!(tmp & GITS_CBASER_SHAREABILITY_MASK )) {
1455+ /*
1456+ * The HW reports non-shareable, we must
1457+ * remove the cacheability attributes as
1458+ * well.
1459+ */
1460+ baser &= ~(GITS_CBASER_SHAREABILITY_MASK |
1461+ GITS_CBASER_CACHEABILITY_MASK );
1462+ baser |= GITS_CBASER_nC ;
1463+ writeq_relaxed (baser , its -> base + GITS_CBASER );
1464+ }
14291465 pr_info ("ITS: using cache flushing for cmd queue\n" );
14301466 its -> flags |= ITS_FLAGS_CMDQ_NEEDS_FLUSHING ;
14311467 }
14321468
1469+ writeq_relaxed (0 , its -> base + GITS_CWRITER );
1470+ writel_relaxed (GITS_CTLR_ENABLE , its -> base + GITS_CTLR );
1471+
14331472 if (of_property_read_bool (its -> msi_chip .of_node , "msi-controller" )) {
14341473 its -> domain = irq_domain_add_tree (NULL , & its_domain_ops , its );
14351474 if (!its -> domain ) {
0 commit comments