@@ -570,8 +570,9 @@ static void cxld_set_interleave(struct cxl_decoder *cxld, u32 *ctrl)
570570
571571static void cxld_set_type (struct cxl_decoder * cxld , u32 * ctrl )
572572{
573- u32p_replace_bits (ctrl , !!(cxld -> target_type == 3 ),
574- CXL_HDM_DECODER0_CTRL_TYPE );
573+ u32p_replace_bits (ctrl ,
574+ !!(cxld -> target_type == CXL_DECODER_HOSTONLYMEM ),
575+ CXL_HDM_DECODER0_CTRL_HOSTONLY );
575576}
576577
577578static int cxlsd_set_targets (struct cxl_switch_decoder * cxlsd , u64 * tgt )
@@ -764,7 +765,7 @@ static int cxl_setup_hdm_decoder_from_dvsec(
764765 if (!len )
765766 return - ENOENT ;
766767
767- cxld -> target_type = CXL_DECODER_EXPANDER ;
768+ cxld -> target_type = CXL_DECODER_HOSTONLYMEM ;
768769 cxld -> commit = NULL ;
769770 cxld -> reset = NULL ;
770771 cxld -> hpa_range = info -> dvsec_range [which ];
@@ -793,8 +794,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
793794 int * target_map , void __iomem * hdm , int which ,
794795 u64 * dpa_base , struct cxl_endpoint_dvsec_info * info )
795796{
797+ struct cxl_endpoint_decoder * cxled = NULL ;
796798 u64 size , base , skip , dpa_size , lo , hi ;
797- struct cxl_endpoint_decoder * cxled ;
798799 bool committed ;
799800 u32 remainder ;
800801 int i , rc ;
@@ -827,6 +828,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
827828 return - ENXIO ;
828829 }
829830
831+ if (info )
832+ cxled = to_cxl_endpoint_decoder (& cxld -> dev );
830833 cxld -> hpa_range = (struct range ) {
831834 .start = base ,
832835 .end = base + size - 1 ,
@@ -837,10 +840,10 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
837840 cxld -> flags |= CXL_DECODER_F_ENABLE ;
838841 if (ctrl & CXL_HDM_DECODER0_CTRL_LOCK )
839842 cxld -> flags |= CXL_DECODER_F_LOCK ;
840- if (FIELD_GET (CXL_HDM_DECODER0_CTRL_TYPE , ctrl ))
841- cxld -> target_type = CXL_DECODER_EXPANDER ;
843+ if (FIELD_GET (CXL_HDM_DECODER0_CTRL_HOSTONLY , ctrl ))
844+ cxld -> target_type = CXL_DECODER_HOSTONLYMEM ;
842845 else
843- cxld -> target_type = CXL_DECODER_ACCELERATOR ;
846+ cxld -> target_type = CXL_DECODER_DEVMEM ;
844847 if (cxld -> id != port -> commit_end + 1 ) {
845848 dev_warn (& port -> dev ,
846849 "decoder%d.%d: Committed out of order\n" ,
@@ -856,12 +859,28 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
856859 }
857860 port -> commit_end = cxld -> id ;
858861 } else {
859- /* unless / until type-2 drivers arrive, assume type-3 */
860- if (FIELD_GET (CXL_HDM_DECODER0_CTRL_TYPE , ctrl ) == 0 ) {
861- ctrl |= CXL_HDM_DECODER0_CTRL_TYPE ;
862+ if (cxled ) {
863+ struct cxl_memdev * cxlmd = cxled_to_memdev (cxled );
864+ struct cxl_dev_state * cxlds = cxlmd -> cxlds ;
865+
866+ /*
867+ * Default by devtype until a device arrives that needs
868+ * more precision.
869+ */
870+ if (cxlds -> type == CXL_DEVTYPE_CLASSMEM )
871+ cxld -> target_type = CXL_DECODER_HOSTONLYMEM ;
872+ else
873+ cxld -> target_type = CXL_DECODER_DEVMEM ;
874+ } else {
875+ /* To be overridden by region type at commit time */
876+ cxld -> target_type = CXL_DECODER_HOSTONLYMEM ;
877+ }
878+
879+ if (!FIELD_GET (CXL_HDM_DECODER0_CTRL_HOSTONLY , ctrl ) &&
880+ cxld -> target_type == CXL_DECODER_HOSTONLYMEM ) {
881+ ctrl |= CXL_HDM_DECODER0_CTRL_HOSTONLY ;
862882 writel (ctrl , hdm + CXL_HDM_DECODER0_CTRL_OFFSET (which ));
863883 }
864- cxld -> target_type = CXL_DECODER_EXPANDER ;
865884 }
866885 rc = eiw_to_ways (FIELD_GET (CXL_HDM_DECODER0_CTRL_IW_MASK , ctrl ),
867886 & cxld -> interleave_ways );
@@ -880,7 +899,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
880899 port -> id , cxld -> id , cxld -> hpa_range .start , cxld -> hpa_range .end ,
881900 cxld -> interleave_ways , cxld -> interleave_granularity );
882901
883- if (!info ) {
902+ if (!cxled ) {
884903 lo = readl (hdm + CXL_HDM_DECODER0_TL_LOW (which ));
885904 hi = readl (hdm + CXL_HDM_DECODER0_TL_HIGH (which ));
886905 target_list .value = (hi << 32 ) + lo ;
@@ -903,7 +922,6 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
903922 lo = readl (hdm + CXL_HDM_DECODER0_SKIP_LOW (which ));
904923 hi = readl (hdm + CXL_HDM_DECODER0_SKIP_HIGH (which ));
905924 skip = (hi << 32 ) + lo ;
906- cxled = to_cxl_endpoint_decoder (& cxld -> dev );
907925 rc = devm_cxl_dpa_reserve (cxled , * dpa_base + skip , dpa_size , skip );
908926 if (rc ) {
909927 dev_err (& port -> dev ,
0 commit comments