Commit d470e9f5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 's390-6.10-8' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Heiko Carstens:

 - Fix and add physical to virtual address translations in dasd and
   virtio_ccw drivers. For virtio_ccw this is just a minimal fix.
   More code cleanup will follow.

 - Small defconfig updates

* tag 's390-6.10-8' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/dasd: Fix invalid dereferencing of indirect CCW data pointer
  s390/vfio_ccw: Fix target addresses of TIC CCWs
  s390: Update defconfigs
parents 2d19be09 b3a58f3b
...@@ -601,17 +601,16 @@ CONFIG_WATCHDOG=y ...@@ -601,17 +601,16 @@ CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SOFT_WATCHDOG=m CONFIG_SOFT_WATCHDOG=m
CONFIG_DIAG288_WATCHDOG=m CONFIG_DIAG288_WATCHDOG=m
CONFIG_DRM=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_FB=y CONFIG_FB=y
# CONFIG_FB_DEVICE is not set # CONFIG_FB_DEVICE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
# CONFIG_HID_SUPPORT is not set # CONFIG_HID_SUPPORT is not set
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
CONFIG_INFINIBAND=m CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_ACCESS=m CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_MLX4_INFINIBAND=m CONFIG_MLX4_INFINIBAND=m
CONFIG_MLX5_INFINIBAND=m CONFIG_MLX5_INFINIBAND=m
CONFIG_SYNC_FILE=y
CONFIG_VFIO=m CONFIG_VFIO=m
CONFIG_VFIO_PCI=m CONFIG_VFIO_PCI=m
CONFIG_MLX5_VFIO_PCI=m CONFIG_MLX5_VFIO_PCI=m
......
...@@ -592,17 +592,16 @@ CONFIG_WATCHDOG_CORE=y ...@@ -592,17 +592,16 @@ CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_WATCHDOG_NOWAYOUT=y
CONFIG_SOFT_WATCHDOG=m CONFIG_SOFT_WATCHDOG=m
CONFIG_DIAG288_WATCHDOG=m CONFIG_DIAG288_WATCHDOG=m
CONFIG_DRM=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_FB=y CONFIG_FB=y
# CONFIG_FB_DEVICE is not set # CONFIG_FB_DEVICE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
# CONFIG_HID_SUPPORT is not set # CONFIG_HID_SUPPORT is not set
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
CONFIG_INFINIBAND=m CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_ACCESS=m CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_MLX4_INFINIBAND=m CONFIG_MLX4_INFINIBAND=m
CONFIG_MLX5_INFINIBAND=m CONFIG_MLX5_INFINIBAND=m
CONFIG_SYNC_FILE=y
CONFIG_VFIO=m CONFIG_VFIO=m
CONFIG_VFIO_PCI=m CONFIG_VFIO_PCI=m
CONFIG_MLX5_VFIO_PCI=m CONFIG_MLX5_VFIO_PCI=m
......
...@@ -4906,7 +4906,7 @@ dasd_eckd_free_cp(struct dasd_ccw_req *cqr, struct request *req) ...@@ -4906,7 +4906,7 @@ dasd_eckd_free_cp(struct dasd_ccw_req *cqr, struct request *req)
ccw++; ccw++;
if (dst) { if (dst) {
if (ccw->flags & CCW_FLAG_IDA) if (ccw->flags & CCW_FLAG_IDA)
cda = *((char **)dma32_to_virt(ccw->cda)); cda = dma64_to_virt(*((dma64_t *)dma32_to_virt(ccw->cda)));
else else
cda = dma32_to_virt(ccw->cda); cda = dma32_to_virt(ccw->cda);
if (dst != cda) { if (dst != cda) {
...@@ -5525,7 +5525,7 @@ dasd_eckd_dump_ccw_range(struct dasd_device *device, struct ccw1 *from, ...@@ -5525,7 +5525,7 @@ dasd_eckd_dump_ccw_range(struct dasd_device *device, struct ccw1 *from,
/* get pointer to data (consider IDALs) */ /* get pointer to data (consider IDALs) */
if (from->flags & CCW_FLAG_IDA) if (from->flags & CCW_FLAG_IDA)
datap = (char *)*((addr_t *)dma32_to_virt(from->cda)); datap = dma64_to_virt(*((dma64_t *)dma32_to_virt(from->cda)));
else else
datap = dma32_to_virt(from->cda); datap = dma32_to_virt(from->cda);
......
...@@ -585,7 +585,7 @@ dasd_fba_free_cp(struct dasd_ccw_req *cqr, struct request *req) ...@@ -585,7 +585,7 @@ dasd_fba_free_cp(struct dasd_ccw_req *cqr, struct request *req)
ccw++; ccw++;
if (dst) { if (dst) {
if (ccw->flags & CCW_FLAG_IDA) if (ccw->flags & CCW_FLAG_IDA)
cda = *((char **)dma32_to_virt(ccw->cda)); cda = dma64_to_virt(*((dma64_t *)dma32_to_virt(ccw->cda)));
else else
cda = dma32_to_virt(ccw->cda); cda = dma32_to_virt(ccw->cda);
if (dst != cda) { if (dst != cda) {
......
...@@ -490,13 +490,14 @@ static int ccwchain_fetch_tic(struct ccw1 *ccw, ...@@ -490,13 +490,14 @@ static int ccwchain_fetch_tic(struct ccw1 *ccw,
struct channel_program *cp) struct channel_program *cp)
{ {
struct ccwchain *iter; struct ccwchain *iter;
u32 cda, ccw_head; u32 offset, ccw_head;
list_for_each_entry(iter, &cp->ccwchain_list, next) { list_for_each_entry(iter, &cp->ccwchain_list, next) {
ccw_head = iter->ch_iova; ccw_head = iter->ch_iova;
if (is_cpa_within_range(ccw->cda, ccw_head, iter->ch_len)) { if (is_cpa_within_range(ccw->cda, ccw_head, iter->ch_len)) {
cda = (u64)iter->ch_ccw + dma32_to_u32(ccw->cda) - ccw_head; /* Calculate offset of TIC target */
ccw->cda = u32_to_dma32(cda); offset = dma32_to_u32(ccw->cda) - ccw_head;
ccw->cda = virt_to_dma32((void *)iter->ch_ccw + offset);
return 0; return 0;
} }
} }
...@@ -914,7 +915,7 @@ void cp_update_scsw(struct channel_program *cp, union scsw *scsw) ...@@ -914,7 +915,7 @@ void cp_update_scsw(struct channel_program *cp, union scsw *scsw)
* in the ioctl directly. Path status changes etc. * in the ioctl directly. Path status changes etc.
*/ */
list_for_each_entry(chain, &cp->ccwchain_list, next) { list_for_each_entry(chain, &cp->ccwchain_list, next) {
ccw_head = (u32)(u64)chain->ch_ccw; ccw_head = dma32_to_u32(virt_to_dma32(chain->ch_ccw));
/* /*
* On successful execution, cpa points just beyond the end * On successful execution, cpa points just beyond the end
* of the chain. * of the chain.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment